<?php
	//******************************************************************************
	// Nastik, inglise-eesti veebisõnastik
	// sven vahar <aabram@gmail.com>
	//
	// NB! See fail on UTF-8 vormingus
	// Kui salvestad faili mõnes muus vormingus, lähevad Nastiku tekstistringid katki.
	// tabstop = 4
	//******************************************************************************

	$time_start = microtime(true);	// kell käima

	mb_internal_encoding("UTF-8");	// kindlasti vajame multibyte funktsioone

	define ('HARD_MINLEN', 2);	// karm min.pikkus, ainult täpsed vasted
	define ('SOFT_MINLEN', 2);	// TODO: paindlik min.pikkus, pagineerime
	define ('PER_PAGE', 50);	// TODO: kirjeid per lk

	$nastik_url = $_SERVER['PHP_SELF'];		// nastiku enese aadress
	$varviskeemid = array(					// lubatud värviskeemide nimekiri
		'classic',
		'blue',
		'green'
	);
	$css = "classic";						// vaikimisi värviskeem

	$do_stats = false;			// vaikimisi statsu ei salvesta
	$laetav_et = '';			// kui mingil põhjusel otsistringi pole, tegeleme tühja stringiga
	$laetav_en = '';			//  ---"---
	$searchlen = 0;				// olgu otsistring vaikimisi nullpikkusega
	$match_et = false;			// täpseid vasteid ei ole
	$match_en = false;			//  ---"---
	$word_et = array(' ');		// eestikeelsete stringide massiiv
	$word_en = array(' ');		// ingliskeelsete stringide massiiv
	$search_raw = '';			// puhastatud otsistring
	$search_trim = '';			// kärbitud otsistring
	$kaunt = 0;					// loendur
	$match_et_count = 0;		// eestikeelseid täpseid vasteid
	$match_en_count = 0;		// ingliskeelseid täpseid vasteid
	$table_match = '';			// HTMLi tabeli osa, millega kuvatakse täpsed vasted
	$table_part = '';			// HTMLi tabeli osa, millega kuvatakse osalised vasted
	$js_lang = 'EN';			// Javascripti jaoks vaikimisi aktiivseks keeleks inglise keel
	$show_info = false;			// lisatekste vaikimisi ei näidata
	$infotekst_et = '';			// eestikeelne lisainfo (teated, hoiatused)
	$infotekst_en = '';			// ingliskeelne lisainfo (teated, hoiatused)
	$search_status = 'NA';		// otsingu olek vaikimisi mitte OK
	$tabindexEN = 1;			// HMTLi tabindexit muudame vastavalt sellele, miskeelne leht laetakse
	$tabindexET = 2;			// kuna vaikimisi on aktiivne EN väli, seega olgu järgmine tabstop ET
	$content_size = 0;			// lehe maht, seda saab salvestada koos muu statistikaga

	// muutujad, millega kuvatakse olulised teated
	$nomatch_et = "<p>Kas oled kindel, et kirjutasid sõna õigesti?<br/><br/>Proovi otsida sõnaosa, mitte terve sõna ega väljendi järgi.<br/><br/> Nastik ei tõlgi lauseid, vaid on mõeldud sõnakaupa otsimiseks.</p>";
	$nomatch_en = "<p>Are you sure that you spelled the word correctly?<br/><br/>Try searching for partial word instead.<br/><br/>Nastik doesn't translate whole sentences, it is meant for single word at a time lookup only.</p>";
	$toofew_en = 'Too few letters, search cancelled.';
	$toofew_et = 'Liiga vähe tähti, otsing tühistatud.';


	// kui värviskeemi param on olemas ja see on ka lubatud skeemide nimekirjas, võtame kasutusele
	if (isset($_GET["v"]) AND in_array($_GET["v"], $varviskeemid)) {
		$css = $_GET["v"];
		setcookie("Nastik", $css, time()+10368000); 			// värviskeemiga küpsis 120 päeva
	} elseif (isset($_COOKIE["Nastik"]) AND in_array($_COOKIE["Nastik"], $varviskeemid)) {	// kui urliga skeemi ei anta, vaatame küpsisest
		$css = $_COOKIE["Nastik"];
	}

	// kui küsitakse "nastiku kohta", siis näitame muudatusi välja
	if (isset($_GET["et_about"]) OR isset($_GET["en_about"])) {
		$changelog_et = file_get_contents('changelog_et');
		$changelog_en = file_get_contents('changelog_en');
	} else {
		$changelog_et = "";
		$changelog_en = "";
	}

	// võtame külge põhibaasi
	$dbh = new PDO("sqlite:nastik.db");

	// esmalt vaatame, palju kirjeid üldse olemas on. kui neid on liiga vähe, nt kui baas katki/poolik,
	// siis saame siinkohal vabandada, katkestada vm ette võtta
	$statement = $dbh->query('SELECT id FROM en_et ORDER BY id DESC LIMIT 1')->fetch(PDO::FETCH_ASSOC);
	$kirjeid_en = $statement['id'];
	// echo "kirjeid en_et: $kirjeid_en<br/>";

	$statement = $dbh->query('SELECT id FROM et_en ORDER BY id DESC LIMIT 1')->fetch(PDO::FETCH_ASSOC);
	$kirjeid_et = $statement['id'];
	// echo "kirjeid et_en: $kirjeid_et<br/>";

	// kui tehti otsing eesti keeles JA sõna on vähemalt miinimumpikkune
	if (isset($_GET["et"]) AND (mb_strlen(trim($_GET["et"])) >= HARD_MINLEN)) {
		$searchlen = mb_strlen(trim($_GET["et"]));
		$js_lang = 'ET';			// javascripti jaoks, et kursor taas samasse kasti paigutada
		$laetav_et = $_GET["et"];
		$search_raw = $laetav_et;
		$do_stats = true;

		// tabindex paika, et tabiga saaks liikuda otse ingliskeelsesse kasti
		$tabindexEN = 2;
		$tabindexET = 1;

		$laetav_et = trim($laetav_et);
		$laetav_et = preg_replace('/\s+/', ' ', $laetav_et);

		// TODO: kas praeguste PHP-versioonidega seda endiselt vaja on?
		// et escape ei tekitakse topelt kurakaldkriipse
		if (get_magic_quotes_gpc()) {
			$laetav_et = stripslashes($laetav_et);
		}
		$laetav_et = sqlite_escape_string($laetav_et);
		$laetav_et = str_replace('_','\_',$laetav_et);
		$laetav_et = str_replace('%','\%',$laetav_et);
		$laetav_et = str_replace('\\',' ',$laetav_et);
		$search_trim = $laetav_et;

		// vastavalt otsisõna pikkusele teeme kas täpse või laiendatud otsingu
		if (($searchlen == HARD_MINLEN) || ($searchlen == SOFT_MINLEN)) {
			$query	= $dbh->prepare("SELECT word_et, word_en FROM et_en WHERE word_et = ? ORDER BY word_et");
			$query->execute(array($laetav_et));
			$searchtype = 'exact';
		} else {
			$query	= $dbh->prepare('SELECT word_et, word_en FROM et_en WHERE word_et LIKE ? ORDER BY word_et');
			$query->execute(array("%$laetav_et%"));
			$searchtype = 'partial';
		}
		$result = $query->fetchAll(PDO::FETCH_ASSOC);
		$kaunt = count($result);
		// echo '$kaunt: '.$kaunt.'<br/>';

		for ($i= 0; $i<$kaunt; $i++){
			$word_et[$i] = $result[$i]["word_et"];
			$word_en[$i] = $result[$i]["word_en"];
		}
	} else {
		$show_info = false;
	}

	// kui tehti otsing inglise keeles JA sõna on vähemalt miinimumpikkune
	if (isset($_GET["en"]) AND (mb_strlen(trim($_GET["en"])) >= HARD_MINLEN)) {
		$searchlen = mb_strlen(trim($_GET["en"]));
		$js_lang = 'EN';			// javascripti jaoks, et kursor taas samasse kasti paigutada
		$laetav_en = $_GET["en"];
		$search_raw = $laetav_en;
		$do_stats = true;

		// tabindex paika, et tabiga saaks liikuda otse ingliskeelsesse kasti
		$tabindexEN = 1;
		$tabindexET = 2;

		// tühikud maha
		$laetav_en = trim($laetav_en);
		$laetav_en = preg_replace('/\s+/', ' ', $laetav_en);

		// TODO: kas praeguste PHP-versioonidega seda endiselt vaja on?
		// et escape ei tekitakse topelt kurakaldkriipse
		if (get_magic_quotes_gpc()) {
			$laetav_en = stripslashes($laetav_en);
		}
		$laetav_en = sqlite_escape_string($laetav_en);
		$laetav_en = str_replace('_','\_',$laetav_en);
		$laetav_en = str_replace('%','\%',$laetav_en);
		$laetav_en = str_replace('\\',' ',$laetav_en);

		$search_trim = $laetav_en;

		if (($searchlen == HARD_MINLEN) || ($searchlen == SOFT_MINLEN)) {
			$query	= $dbh->prepare("SELECT word_en, word_et FROM en_et WHERE word_en = ? ORDER BY word_en");
			$query->execute(array($laetav_en));
			$searchtype = 'exact';
		} else {
			$query	= $dbh->prepare('SELECT word_en, word_et FROM en_et WHERE word_en LIKE ? ORDER BY word_en');
			$query->execute(array("%$laetav_en%"));
			$searchtype = 'partial';
		}

		$result = $query->fetchAll(PDO::FETCH_ASSOC);
		$kaunt = count($result);
		// echo '$kaunt: '.$kaunt.'<br/>';

		for ($i= 0; $i<$kaunt; $i++){
			$word_en[$i] = $result[$i]["word_en"];
			$word_et[$i] = $result[$i]["word_et"];
		}
	} else {
		$show_info = false;
	}

	// output handler lehe mahu mõõtmiseks
	ob_start();

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<title> Nastik </title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<meta name="Author" content="sven vahar, sven ät gmail punkt com, http://aab.pri.ee/nastik"/>
	<meta name="Keywords" content="sõnastik, sõnaraamat, dictionary, nastik, inglise-eesti, eesti-inglise, estonian-english, english-estonian, nastik"/>
	<meta name="Description" content="Vahva inglise-eesti sõnastik / Cute english-estonian dictionary"/>
	<link rel="shortcut icon" href="favicon.ico"/>
	<link rel="stylesheet" href="nastik.css" type="text/css"/>
	<link rel="stylesheet" href="<?php echo $css ?>.css" type="text/css"/>
	<script language="JavaScript" type="text/javascript">
	//<![CDATA[
		function init() {
			// fookus antakse selle keele lahtrisse, milles otsing tehti
			document.getElementById('auk<?php echo $js_lang ?>').focus();
		}
	//]]>
	</script>
</head>

<body onload="init();">

<noscript>
	<center>
		Kui sa kasutad Nastikut tekstirezhiimis, siis sobivad selleks hästi links või elinks.<br/>
		In text-mode it is more convenient to use Nastik with either links or elinks.<br/><br/>
	</center>
</noscript>

<table width="600" align="center" border="0" cellpadding="0" cellspacing="1" class="suurTabel">
<thead>
<tr class="trNoHover">
	<td align="center"><a href="?en_about" class="toplink">about nastik</a> <a href="?en_tips" class="toplink">search tips</a></td>
	<td align="center"><a href="?et_about" class="toplink">nastiku kohta</a> <a href="?et_tips" class="toplink">otsinguabi</a></td>
</tr>
<tr>
	<th width="50%" align="center">
		<form name="otsiEN" method="get" action="<?php echo $nastik_url ?>">
			english&nbsp;&nbsp;<span class="clear" onclick="document.getElementById('aukEN').value='';document.getElementById('aukEN').focus();">x</span>&nbsp;<input id="aukEN" name="en" tabindex="<?php echo $tabindexEN ?>" value="<?php echo stripslashes($laetav_en) ?>"/>&nbsp;<span class="go" onclick="document.forms.otsiEN.submit();">&raquo;</span>
		</form>
	</th>
	<th width="50%" align="center" valign="middle">
		<form name="otsiET" method="get" action="<?php echo $nastik_url ?>">
			eesti&nbsp;&nbsp;<span class="clear" onclick="document.getElementById('aukET').value='';document.getElementById('aukET').focus();">x</span>&nbsp;<input id="aukET" name="et" tabindex="<?php echo $tabindexET ?>" value="<?php echo stripslashes($laetav_et) ?>"/>&nbsp;<span class="go" onclick="document.forms.otsiET.submit();">&raquo;</span>
		</form>
	</th>
</tr>
</thead>
<tbody>
<?php
	// TODO: sisu ja kujunduse eraldamiseks templeidisüsteem, eeldusel, et see ei too kaasa mõttetut ajakulu

	if (($searchlen == HARD_MINLEN) OR ($searchlen == SOFT_MINLEN)) {
		$show_info = true;
		$infotekst_en .= "$searchlen-letter search will be carried out against exact matches, partial matches will not be checked.";
		$infotekst_et .= "$searchlen-tähelise otsingu puhul tehakse ainult täpne otsing, osalist kattuvust ei kontrollita.";
	}

	if ($searchlen < HARD_MINLEN) {
		$show_info = true;
		$infotekst_en = $toofew_en;
		$infotekst_et = $toofew_et;
	}

	if ($searchlen == 0) {
		$show_info = false;
	}

	// kui eestikeelne otsing
	if (isset($_GET["et"])) {
		// oletame, et on OK, kui vasteid pole, siis muudame staatust
		$search_status = 'OK';
		// kui vasteid ei leitud
		if ($kaunt == 0) {
			$search_status = 'NF';
			$table_match = '<tr>'."\n".'<td align="center" class="toonHele">&nbsp;</td><td align="center" class="toonHele">vasteid ei leidunud</td>'."\n".'</tr>'."\n<tr class='trNoHover'><td colspan='2'>&nbsp;</td></tr>";
			if ($searchlen > SOFT_MINLEN) {
				$show_info = true;
				$infotekst_et = $nomatch_et;
				$infotekst_en = $nomatch_en;	// selleks, et kuvada mõlemasse kasti tekst
			}
		}

		// kui täpne otsisõna leidub tulemuste seas, loeme korrad kokku
		if ((count($word_et) > 0) AND in_array($laetav_et,$word_et)) {
			$match_et = true;
			for ($i=0; $i < $kaunt; $i++){
				if ($laetav_et == $word_et[$i]) {
					$match_et_count = $match_et_count + 1;
				}
			}
			$table_match = '<tr>'."\n".'<td align="center" class="toonHele">&nbsp;</td><td align="center" class="toonHele">täpseid vasteid: '.$match_et_count.'</td>'."\n".'</tr>'."\n";
		}

		// kui tulemuste arv on suurem täpsete vastete arvust,
		// siis on olemas ka osalisi vasted, muidu mitte
		if ($kaunt > $match_et_count) {
			$partial_matches = $kaunt - $match_et_count;
			$table_part = '<tr>'."\n".'<td align="center" class="toonHele">&nbsp;</td><td align="center" class="toonHele">osalisi vasteid: '.$partial_matches.'</td>'."\n".'</tr>'."\n";
		}

		for ($i=0; $i < $kaunt; $i++){
			if ($match_et AND ($laetav_et == $word_et[$i])) {
				$table_match = $table_match.'<tr><td>'.$word_en[$i].'</td><td>'.$word_et[$i].'</td></tr>'."\n";
			} else {
				$table_part = $table_part.'<tr><td>'.$word_en[$i].'</td><td>'.$word_et[$i].'</td></tr>'."\n";
			}
		}
	}

	// kui ingliskeelne otsing
	if (isset($_GET["en"])) {
		// oletame, et on OK, kui vasteid pole, siis muudame staatust
		$search_status = 'OK';
		// kui vasteid ei leidunud
		if ($kaunt == 0) {
			$search_status = 'NF';
			$table_match = '<tr>'."\n".'<td align="center" class="toonHele">no matches found</td><td align="center" class="toonHele">&nbsp;</td>'."\n".'</tr>'."\n<tr class='trNoHover'><td colspan='2'>&nbsp;</td></tr>\n";
			if ($searchlen > SOFT_MINLEN) {
				$show_info = true;
				$infotekst_en = $nomatch_en;
				$infotekst_et = $nomatch_et;	// selleks, et kuvada mõlemasse kasti tekst
			}
		}

		// kui täpne otsisõna leidub tulemuste seas,
		// ajame lipu püsti ja loeme korrad kokku
		if ((count($word_en) > 0) AND in_array($laetav_en,$word_en)) {
			$match_en = true;
			for ($i=0; $i < $kaunt; $i++){
				if ($laetav_en == $word_en[$i]) {
					$match_en_count = $match_en_count + 1;
				}
			}
			$table_match = '<tr>'."\n".'<td align="center" class="toonHele">exact match: '.$match_en_count.'</td><td align="center" class="toonHele">&nbsp;</td>'."\n".'</tr>'."\n";
		}

		// kui tulemuste arv on suurem täpsete vastete arvust,
		// siis on olemas ka osalisi vasted, muidu mitte
		if ($kaunt > $match_en_count) {
			$partial_matches = $kaunt - $match_en_count;
			$table_part = '<tr>'."\n".'<td align="center" class="toonHele">partial matches: '.$partial_matches.'</td><td align="center" class="toonHele">&nbsp;</td>'."\n".'</tr>'."\n";
		}

		for ($i=0; $i < $kaunt; $i++){
			if ($match_en AND ($laetav_en == $word_en[$i])) {
				$table_match = $table_match.'<tr><td>'.$word_en[$i].'</td><td>'.$word_et[$i].'</td></tr>'."\n";
			} else {
				$table_part = $table_part.'<tr><td>'.$word_en[$i].'</td><td>'.$word_et[$i].'</td></tr>'."\n";
			}
		}
	}

	// kui sooviti abiteavet, siis kuvame inforead jällegi välja
	if (isset($_GET["en_about"]) OR isset($_GET["et_about"])) {
		$do_stats = false;
		$infotekst_en = <<<EOT
<p>
	<strong>About Nastik</strong>
</p>
<p>
	Nastik is free online English-Estonian / Estonian-English dictionary. Nastik uses free <a href="http://www.eki.ee/keeletehnoloogia/projektid/inglise-eesti/">wordlist</a> provided by <a href="http://www.eki.ee/">Institute of the Estonian Language</a>.
</p>
<p>
	Nastik createad by Sven Vahar (aabram at gmail com).
</p>
EOT;

		$infotekst_et = <<<EOT
<p>
	<strong>Nastiku kohta</strong>
</p>
<p>
	Nastik on inglise-eesti / eesti-inglise veebisõnastik. Nastik kasutab <a href="http://www.eki.ee/">Eesti Keele Instituudi</a> poolt jagatavat <a href="http://www.eki.ee/keeletehnoloogia/projektid/inglise-eesti/">s&otilde;nabaasi</a>.
</p>
<p>
	Lisalugemist: <a href="http://aab.pri.ee/nastik">http://aab.pri.ee/nastik</a>.<br/>
	Nastiku algne autor on Sven Vahar (aabram ät gmail com).
</p>
EOT;
		$show_info = true;
	}

	// kui sooviti otsginguabi, siis kuvame inforead jällegi välja
	if (isset($_GET["en_tips"]) OR isset($_GET["et_tips"])) {
		$do_stats = false;

		// ingliskeelsed tipsid
		$infotekst_en = <<<EOT
<p>
	<strong>Search tips</strong>
</p>
<p>
	Search is case-insensitive.
</p>
<p>
	Nastik doesn't yet support neither boolean searches (AND, NOT, OR) nor wildcards (*, ?). Do not search for sentences or several words at once ("big hairy animal").
</p>
<p>
	If search didn't yield any results try searching for parts of the word, you may have misspelled the word or copied it incorrectly. Try shortening the word and see if that helps: try searching for "capitali" instead of "capitalise".	 Also, Nastik may have only either British or American version of the word (capitalize vs capitalise).
</p>
<p>
	Use base forms for words:
</p>
	<ul>
		<li>do not use plurals: search for "river" not "rivers"</li>
		<li>do not use possessive nouns: search for "platypus" not "platypus's"</li>
		<li>do not use prepositions: search for "jump" not "to jump", search for "friday" not "on friday"</li>
		<li>for estonian words use nominative case: search for "mäger" not "mägra"</li>
		<li>etc, you get the idea</li>
	</ul>
<p>
	Split up searches - for example, if "brass orchestra" doesn't yield any results try searching for "orchestra" and "brass". Chances are that you'll find other helpful entries which may convey the meaning.
</p>
EOT;

		// eestikeelsed tipsid
		$infotekst_et = <<<EOT
<p>
	<strong>Otsinguabi</strong>
</p>
<p>
	Otsing on tõstutundetu.
</p>
<p>
	Nastik ei toeta täiendavat otsinguloogikat (KOOS, ILMA, VÕI) ega metamärke (*, ?). Ära otsi lauseid ega mitut sõna korraga ("suur lai trepp").
</p>
<p>
	Kui otsing ei andnud tulemusi, proovi otsida sõnaosa järgi, võib-olla oled sa sõna valesti kirjutanud või kopeerinud. Sõna lühendamine võib anda tulemusi, näiteks "reesusmakaak" asemel proovi "reesus". Samuti võib Nastikus leiduda kas ainult Briti või Ameerika sõnakuju (capitalize vs capitalise).
</p>
<p>
	Otsi sõna põhivormi järgi:
</p>
	<ul>
		<li>kasuta ainsust: "pärdik", mitte "pärdikud"; inglise keele puhul näiteks "lake", mitte "lakes"</li>
		<li>kasuta ainult nimetavat käänet: "mäger", mitte "mägra"; inglise keele puhul näiteks "octopus", mitte "octopus's"</li>
		<li>inglise keele puhul ära kasuta eessõnu: "jump", mitte "to jump"; "friday", mitte "on friday"</li>
		<li>jne samas vaimus</li>
	</ul>
<p>
	Jaga otsing osadeks - näiteks "karukoobas" asemel tee otsing "karu" ja "koobas".
</p>
EOT;
		$show_info = true;
	}

	// väljastame tabeli read
	echo $table_match;
	echo $table_part;

	// kell kinni
	$time_end = microtime(true);
	$time = round(($time_end - $time_start), 3);

?>

<?php
	if ($show_info) {
$inforow = <<<EOT
<tr class="trNoHover">
	<td width="50%" class="toon" valign="top">
			$infotekst_en
			$changelog_en
	</td>
	<td width="50%" class="toon" valign="top">
			$infotekst_et
			$changelog_et
	</td>
</tr>
EOT;

echo $inforow;
	}

$footer = <<<EOT
<tr class="trNoHover">
	<td align="right" class="stats" colspan="2">
		<a href="?v=blue" class="vRuut vBlue" title="Sinine värviskeem">&nbsp;&nbsp;&nbsp;&nbsp;</a>
		<a href="?v=green" class="vRuut vGreen" title="Roheline värviskeem">&nbsp;&nbsp;&nbsp;&nbsp;</a>
		<a href="?v=classic" class="vRuut vClassic" title="Algupärane värviskeem">&nbsp;&nbsp;&nbsp;&nbsp;</a>

		<a href="$nastik_url">Nastik v1.5</a> kasutab <a href="http://www.eki.ee/" class="eki">EKI</a> inglise-eesti <a href="http://www.eki.ee/keeletehnoloogia/projektid/inglise-eesti/">sõnabaasi</a>.<br/>
		Inglise-eesti suunal $kirjeid_en kirjet, eesti-inglise suunal $kirjeid_et kirjet.<br/>
		$time sek.
	</td>
</tr>
EOT;

	echo $footer;

?>

</tbody>
</table>

</body>
</html>

<?php
	$content_size = ob_get_length();

	// stats baasi
	// SQLite versioonis tegemata, kood vale
	$do_stats = false;
	if ($do_stats) {
		// salvestame toore otsingusõna ainult siis, kui see erineb puhastatust
		if ($search_raw != $search_trim) {
			$query	= "INSERT INTO stats (id,lang,search_raw,search_trim,status,date,duration,pg_size) VALUES ('', '$js_lang', '$search_raw', '$search_trim', '$search_status', NOW(), '$duration', '$content_size');";
		} else {
			$query	= "INSERT INTO stats (id,lang,search_raw,search_trim,status,date,duration,pg_size) VALUES ('', '$js_lang', '', '$search_trim', '$search_status', NOW(), '$duration', '$content_size');";
		}
		$result = $db->insert($query);
	}
?>